home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / sbin / backup.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  2005-10-18  |  8KB  |  329 lines

  1. #! /bin/sh
  2. # This program is part of GNU tar
  3. # Copyright 2004, Free Software Foundation
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 1, or (at your option)
  8. # any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  18. # 02111-1307, USA.
  19.  
  20. PROGNAME=`basename $0`
  21. CONFIGPATH="$SYSCONFDIR/backup"
  22. REMOTEBACKUPDIR="$SYSCONFDIR/tar-backup"
  23. CONFIGFILE=${CONFIGPATH}/backup-specs
  24. DIRLIST=${CONFIGPATH}/dirs
  25. FILELIST=${CONFIGPATH}/files
  26. LOGPATH=${CONFIGPATH}/log
  27.  
  28. # Default functions for running various magnetic tape commands
  29. mt_begin() {
  30.     mt -f "$1" retension
  31. }
  32.  
  33. mt_rewind() {
  34.     mt -f "$1" rewind
  35. }
  36.  
  37. mt_offline() {
  38.     mt -f "$1" offl
  39. }
  40.  
  41. mt_status() {
  42.     mt -f "$1" status
  43. }
  44.  
  45. # The main configuration file may override any of these variables
  46. MT_BEGIN=mt_begin
  47. MT_REWIND=mt_rewind
  48. MT_OFFLINE=mt_offl
  49. MT_STATUS=mt_status
  50.  
  51. # Insure `mail' is in PATH.
  52. PATH="/usr/ucb:${PATH}"
  53. export PATH
  54. # Put startdate in the subject line of mailed report, since if it happens
  55. # to run longer than 24 hours (as may be the case if someone forgets to put
  56. # in the next volume of the tape in adequate time), the backup date won't
  57. # appear too misleading.
  58. startdate="`date`"
  59. here="`pwd`"
  60. # Save local hostname
  61. localhost="`hostname | sed -e 's/\..*//' | tr A-Z a-z`"
  62.  
  63. # Produce a diagnostic output
  64. message() {
  65.     if [ "$VERBOSE" != "" ]; then
  66.     if [ $VERBOSE -ge $1 ]; then
  67.         shift
  68.         echo "$@" >&2
  69.     fi
  70.     fi
  71. }
  72.  
  73. # Bail out and exit.
  74. bailout() {
  75.     echo "$PROGNAME: $*" >&2
  76.     exit 1
  77. }
  78.  
  79. # Return current date
  80. now() {
  81.     date +%Y-%m-%d
  82. }
  83.  
  84. # Bail out if we don't have root privileges.
  85. test_root() {
  86.     if [ ! -w ${ROOT_FS-/} ]; then
  87.     bailout "The backup must be run as root or else some files will fail to be dumped."
  88.     fi
  89.     case "${ROOT_FS}" in
  90.     */)      ;;
  91.     *)      ROOT_FS="${ROOT_FS}/"
  92.     esac
  93. }
  94.  
  95. advice() {
  96.     echo "Directory $1 is not found." >&2
  97.     cat >&2 <<EOF
  98. The following directories and files are needed for the backup to function:
  99.  
  100. 1. Directory with configuration files and file lists:
  101. $CONFIGPATH
  102. 2. Directory for backup log files
  103. $LOGPATH
  104. 3. Main configuration file
  105. $CONFIGFILE
  106.  
  107. Please, create these and invoke the script again.
  108. EOF
  109. }
  110.  
  111. init_common() {
  112.     # Check if the necessary directories exist
  113.     if [ ! -d $CONFIGPATH ]; then
  114.     advice $CONFIGPATH
  115.     exit 1
  116.     fi
  117.     if [ ! -d $LOGPATH ]; then
  118.     if mkdir $LOGPATH; then
  119.         :
  120.     else
  121.         advice $LOGPATH
  122.         exit 1
  123.     fi
  124.     fi    
  125.     # Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
  126.     if [ ! -r $CONFIGFILE ]; then
  127.     echo "$PROGNAME: cannot read $CONFIGFILE. Stop." >&2
  128.     exit 1
  129.     fi
  130.     . $CONFIGFILE
  131.  
  132.     # Environment sanity check
  133.  
  134.     test_root
  135.  
  136.     if [ x"${ADMINISTRATOR}" = x ]; then 
  137.     bailout "ADMINISTRATOR not defined"
  138.     fi
  139.  
  140.     [ x"$TAR" = x ] && TAR=tar
  141.     [ x"$SLEEP_TIME" = x ] && SLEEP_TIME=60
  142.  
  143.     if [ x$VOLNO_FILE = x ]; then
  144.     bailout "VOLNO_FILE not specified" 
  145.     fi
  146.  
  147.     if [ -r $DIRLIST ]; then
  148.     BACKUP_DIRS="$BACKUP_DIRS `cat $DIRLIST`"
  149.     fi
  150.     if [ -r $FILELIST ]; then
  151.     BACKUP_FILES="$BACKUP_FILES `cat $FILELIST`"
  152.     fi
  153.  
  154.     if [ \( x"$BACKUP_DIRS" = x \) -a \( x"$BACKUP_FILES" = x \) ]; then
  155.     bailout "Neither BACKUP_DIRS nor BACKUP_FILES specified"
  156.     fi
  157.     if [ "$RSH" = "" ]; then
  158.     RSH=rsh
  159.     fi
  160.     POSIXLY_CORRECT=1
  161.     export POSIXLY_CORRECT
  162. }
  163.  
  164. init_backup() {
  165.     init_common
  166.     TAR_PART1="${TAR} -c --format=gnu --multi-volume --one-file-system --sparse --volno-file=${VOLNO_FILE}"
  167.     if [ "x$XLIST" != x ]; then
  168.     TAR_PART1="${TAR_PART1} \`test -r $REMOTEBACKUPDIR/$XLIST && echo \"--exclude-from $REMOTEBACKUPDIR/$XLIST\"\`"
  169.     fi
  170.     if [ "$RSH_COMMAND" != "" ]; then
  171.     TAR_PART1="${TAR_PART1} --rsh-command=$RSH_COMMAND"
  172.     fi
  173.     if [ x$BLOCKING != x ]; then
  174.     TAR_PART1="${TAR_PART1} --blocking=${BLOCKING}"
  175.     fi
  176.  
  177.     # Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
  178.     if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
  179.     TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
  180.     fi
  181.     # Set logfile name
  182.     # Logfile name should be in the form  ``log-1993-03-18-level-0''
  183.     # They go in the directory `/etc/log'.
  184.     # i.e. year-month-date.  This format is useful for sorting by name, since
  185.     # logfiles are intentionally kept online for future reference.
  186.     LOGFILE="${LOGPATH}/log-`now`-level-${DUMP_LEVEL}"
  187. }
  188.  
  189. init_restore() {
  190.     init_common
  191.     # FIXME: Replace --list with --extract
  192.     TAR_PART1="${TAR} --extract --multi-volume"
  193.     if [ "$RSH_COMMAND" != "" ]; then
  194.     TAR_PART1="${TAR_PART1} --rsh-command=$RSH_COMMAND"
  195.     fi
  196.     if [ x$BLOCKING != x ]; then
  197.     TAR_PART1="${TAR_PART1} --blocking=${BLOCKING}"
  198.     fi
  199.  
  200.     # Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
  201.     if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
  202.     TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
  203.     fi
  204.     LOGFILE="${LOGPATH}/restore-`now`"
  205. }
  206.  
  207. wait_time() {
  208.     if [ "${1}" != "now" ]; then
  209.     if [ "${1}x" != "x" ]; then
  210.         spec="${1}"
  211.     else
  212.         spec="${BACKUP_HOUR}"
  213.     fi
  214.  
  215.     pausetime="`date | awk -v spec=\"${spec}\" '
  216.         BEGIN {
  217.             split(spec, time, ":")
  218.         }
  219.         {
  220.             split($4, now, ":")
  221.             diff = 3600 * (time[1] - now[1]) + 60 * (time[2] - now[2]);
  222.             if (diff < 0)
  223.             diff += 3600 * 24
  224.             print diff    
  225.         }'`"
  226.     clear
  227.     echo "${SLEEP_MESSAGE}"
  228.     sleep "${pausetime}"
  229.     fi
  230. }
  231.  
  232. level_log_name() {
  233.     echo "$REMOTEBACKUPDIR/${1}.level-${2-$DUMP_LEVEL}"
  234. }
  235.  
  236. # Prepare a temporary level logfile
  237. # usage: make_level_log HOSTNAME
  238. make_level_log() {
  239.     if [ "z${localhost}" != "z$1" ] ; then
  240.     $RSH "$1" mkdir $REMOTEBACKUPDIR > /dev/null 2>&1
  241.         $RSH "$1" rm -f `level_log_name temp`
  242.     else
  243.         mkdir $REMOTEBACKUPDIR > /dev/null 2>&1
  244.         rm -f `level_log_name temp`
  245.     fi
  246. }
  247.  
  248. # Rename temporary log
  249. # usage: flush_level_log HOSTNAME FSNAME
  250. flush_level_log() {
  251.     message 10 "RENAME: `level_log_name temp` --> `level_log_name $2`"
  252.     if [ "z${localhost}" != "z$1" ] ; then
  253.     $RSH "$1" mv -f `level_log_name temp` "`level_log_name $2`"
  254.     else
  255.         mv -f `level_log_name temp` "`level_log_name $2`"
  256.     fi
  257. }
  258.  
  259. # Return the timestamp of the last backup.
  260. # usage: get_dump_time LEVEL
  261. get_dump_time() {
  262.     ls -r ${LOGPATH}/log-*-level-$1 \
  263.         | head -1 \
  264.     | sed "s,.*log-\(.*\)-level-$1,\1,"
  265. }
  266.  
  267. # Do actual backup on a host
  268. # usage: backup_host HOSTNAME [TAR_ARGUMENTS]
  269. backup_host() {
  270.     message 10 "ARGS: $@"
  271.     rhost=$1
  272.     shift
  273.     if [ "z${localhost}" != "z$rhost" ] ; then
  274.     $RSH "$rhost" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" $@
  275.     else
  276.     # Using `sh -c exec' causes nested quoting and shell substitution
  277.         # to be handled here in the same way rsh handles it.
  278.         CMD="exec ${TAR_PART1} -f \"${TAPE_FILE}\" $@"
  279.         message 10 "CMD: $CMD"
  280.         sh -c "$CMD"
  281.         message 10 "RC: $?"
  282.     fi
  283. }
  284.  
  285. print_level() {
  286.     if [ ${1-$DUMP_LEVEL} -eq 0 ]; then
  287.     echo "Full"
  288.     else
  289.         echo "Level ${1-$DUMP_LEVEL}"
  290.     fi
  291. }        
  292.  
  293. prev_level() {
  294.     print_level `expr $DUMP_LEVEL - 1` | tr A-Z a-z
  295. }
  296.  
  297. remote_run() {
  298.     rhost=$1
  299.     shift
  300.     message 10 "REMOTE $rhost: $@"
  301.     if [ "x$rhost" != "x${localhost}" ] ; then
  302.     $RSH "${rhost}" "$@"
  303.     else
  304.         $*
  305.     fi
  306. }
  307.  
  308. license() {
  309.     cat - <<EOF
  310.     This program is part of GNU tar
  311.     Copyright 2004, Free Software Foundation
  312.  
  313.     This program is free software; you can redistribute it and/or modify
  314.     it under the terms of the GNU General Public License as published by
  315.     the Free Software Foundation; either version 1, or (at your option)
  316.     any later version.
  317.  
  318.     This program is distributed in the hope that it will be useful,
  319.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  320.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  321.     GNU General Public License for more details.
  322.  
  323.     You should have received a copy of the GNU General Public License
  324.     along with this program; if not, write to the Free Software
  325.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  326.     02111-1307, USA.
  327. EOF
  328. }
  329.